package sys_ctrl

import (
	"net/http"
	"ubt-aio-service/app/mod/sys_mod"
	"ubt-aio-service/app/pkg/code"
	"ubt-aio-service/app/pkg/parse"
	"ubt-aio-service/app/serv/sys_serv"
	"ubt-aio-service/app/utils"
)

type sysNote struct{}

var SysNoteCtrl sysNote

// SyncSend 发送消息，用于直接调用
func (c *sysNote) SyncSend(contents map[string]string) {
	req := &sys_mod.SysNoteSaveReq{
		NoteId:   code.NewNanoid(21),
		Title:    contents["title"],
		Contents: contents["content"],
		UserIds:  contents["userId"],
		States:   1,
	}
	res := sys_serv.SysUserServ.SelRoleUsers()
	var userIds string
	if res.Code == utils.Succeed.Code {
		for _, user := range res.Data.([]map[string]any) {
			userIds += user["userId"].(string) + ","
		}
		userIds = userIds[:len(userIds)-1]
	}
	req.UserIds = userIds
	sys_serv.SysNoteServ.Add(req)
	ch := make(chan int)
	go sys_serv.SysNoteServ.RelSpecUser(ch, req.NoteId)
	ch <- 1
}

// AsyncSend 发送消息，用于接口异步调用
func (c *sysNote) AsyncSend(ch chan int, contents map[string]string) {
	req := &sys_mod.SysNoteSaveReq{
		NoteId:   code.NewNanoid(21),
		Title:    contents["title"],
		Contents: contents["content"],
		UserIds:  "",
		States:   1,
	}
	res := sys_serv.SysUserServ.SelRoleUsers()
	var userIds string
	if res.Code == utils.Succeed.Code {
		for _, user := range res.Data.([]map[string]any) {
			userIds += user["userId"].(string) + ","
		}
		userIds = userIds[:len(userIds)-1]
	}
	req.UserIds = userIds
	sys_serv.SysNoteServ.Add(req)
	curChan := make(chan int)
	go sys_serv.SysNoteServ.RelRoleUser(curChan, req.NoteId)
	curChan <- 1
	<-ch
}

// Process 处理消息
func (c *sysNote) Process(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	req := &sys_mod.SysNoteProReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(r, req); err != "" {
		utils.ToJson(w, &utils.ResJson{Code: utils.ParamErr.Code, Msg: err})
		return
	}
	// 过滤关键参数值中的非法字符
	req.RelIds = utils.InputFilter(req.RelIds, true)
	res := sys_serv.SysNoteServ.Process(req)
	if res.Code == utils.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: utils.SysNote, IpAddr: userInfo.ClientIp, Kind: req.States}
		sys_serv.SysLogServ.Add(logReq)
	}
	utils.ToJson(w, res)
}

// One 获取消息详情
func (c *sysNote) One(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	// 过滤关键参数值中的非法字符
	noteId := u.Get("noteId")
	noteId = utils.InputFilter(noteId, true)
	if noteId == "" || len(noteId) != 21 {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	res := sys_serv.SysNoteServ.One(noteId)
	utils.ToJson(w, res)
}

// Page 获取消息分页列表
func (c *sysNote) Page(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	// 过滤关键参数值中的非法字符
	u := r.URL.Query()
	if u == nil {
		utils.ToJson(w, utils.ParamErr)
		return
	}
	keywords := u.Get("keywords")
	beginTimes := u.Get("beginTime")
	endTimes := u.Get("endTime")
	limits := u.Get("limit")
	offsets := u.Get("offset")
	keywords = utils.InputFilter(keywords, false)
	limits = utils.InputFilter(limits, true)
	offsets = utils.InputFilter(offsets, true)
	limit := parse.Str2u8(limits)
	offset := parse.Str2u32(offsets)
	beginTime := parse.Str2int(beginTimes)
	endTime := parse.Str2int(endTimes)
	// 先统计信息的数量
	req := &sys_mod.SysNotePageReq{UserId: userInfo.UserId, Keywords: keywords, BeginTime: beginTime, EndTime: endTime}
	res := sys_serv.SysNoteServ.Count(req)
	if res.Code == utils.Succeed.Code {
		dto := &sys_mod.SysNotePageRes{Total: res.Data.(map[string]any)["nums"].(int64)}
		// 再查询具体的信息列表
		req.Limit = limit
		req.Offset = offset
		if res = sys_serv.SysNoteServ.Page(req); res.Code == utils.Succeed.Code {
			dto.List = res.Data
			utils.ToJson(w, &utils.ResJson{Code: res.Code, Msg: res.Msg, Data: dto})
			return
		}
	}
	utils.ToJson(w, res)
}

// New 查询是否存在未读消息
func (c *sysNote) New(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	res := sys_serv.SysNoteServ.New(userInfo.UserId)
	utils.ToJson(w, res)
}

// Read 已读消息
func (c *sysNote) Read(r *http.Request, w http.ResponseWriter) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get(utils.Token)
	userInfo := sys_serv.GetUserInfo(token)
	if userInfo == nil {
		utils.ToJson(w, utils.NoLogin)
		return
	}
	req := &sys_mod.SysNoteReadReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(r, req); err != "" {
		utils.ToJson(w, &utils.ResJson{Code: utils.ParamErr.Code, Msg: err})
		return
	}
	res := sys_serv.SysNoteServ.Read(req.RelId)
	if res.Code == utils.Succeed.Code {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, MenuCode: utils.SysNote, IpAddr: userInfo.ClientIp, Kind: 7}
		sys_serv.SysLogServ.Add(logReq)
	}
	utils.ToJson(w, res)
}
